from dataclasses import dataclass


@dataclass(order=True)
class Result(object):
    """
    返回结果对象, 用于前端数据返回
    Attributes:
        code:       结果代码, 0默认成功,
        message:    结果信息
        data:       结果内容, 可接受任何参数
    注意, 没有实现对data的序列化, 直接用本类返回对象数组极大可能报错
    """

    code: int = 0
    message: str = "请求成功"
    data: object = None

    def to_json(self):
        """最最基础的返回方法"""
        return self.__dict__


class ListResult(Result):

    """数组结果返回对象, 主要用于配合ORM封装中的list方法"""

    def to_json(self):
        result = self.__dict__
        # 对data进行处理, 返回字典结果
        result['data'] = [item.to_dict()
                          for item in self.data] if isinstance(self.data, list) else None
        return result


@dataclass
class PageResult(ListResult):

    """
    分页结果返回对象, 用于配合ORM封装中的list方法
    Attributes:
        page:   当前页数
        size:   每页元素数量
        pages:  总页数
        total:  总元素数
    """

    page: int = 1
    size: int = 50
    pages: int = 1
    total: int = 1

    def __post_init__(self):
        """追加初始化方法, 将sqlalchemy的分页内容赋值给类属性"""
        self.page = self.data.page
        self.size = self.data.per_page
        self.pages = self.data.pages
        self.total = self.data.total
        self.data = self.data.items
